package com.xingchi.tornado.mybatisplus.config;

import com.baomidou.mybatisplus.annotation.DbType;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * MyBatis-Plus属性配置
 * 用于集中管理MyBatis-Plus的各项配置
 *
 * @author xingchi
 * @date 2023/6/22 20:59
 * @modified xingchi
 */
@Data
@ConfigurationProperties(prefix = "xingchi.tornado.mybatis-plus")
public class MybatisPlusProperties {

    /**
     * 日志配置
     */
    private LoggingConfig logging = new LoggingConfig();

    /**
     * 数据库类型
     */
    private DbType dbType = DbType.MYSQL;

    /**
     * 分页插件参数
     */
    private Long maxLimit = 1000L;

    /**
     * 分页参数溢出处理 true:使用第一页 false:使用最大页
     */
    private boolean overflow = false;

    /**
     * 是否启用乐观锁插件
     */
    private boolean optimisticLockerEnabled = true;

    /**
     * 是否启用防全表更新与删除插件
     */
    private boolean blockAttackEnabled = true;

    /**
     * 是否启用SQL合法性检查插件
     */
    private boolean illegalSqlEnabled = false;

    /**
     * 加解密配置
     */
    private EncryptConfig encrypt = new EncryptConfig();

    /**
     * 是否启用数据加密
     */
    private boolean encryptionEnabled = false;

    /**
     * 脱敏配置
     */
    private DesensitizationConfig desensitization = new DesensitizationConfig();

    /**
     * 是否启用数据脱敏
     */
    private boolean desensitizationEnabled = false;

    /**
     * 缓存配置
     */
    private CacheConfig cache = new CacheConfig();

    /**
     * 是否启用缓存
     */
    private boolean cacheEnabled = false;

    /**
     * 日志配置类
     */
    @Data
    public static class LoggingConfig {
        /**
         * 是否开启SQL日志记录
         */
        private boolean enable = false;

        /**
         * 是否开启异步日志记录
         */
        private boolean asyncEnabled = true;

        /**
         * 是否记录慢SQL
         */
        private boolean slowSqlEnabled = true;

        /**
         * 慢SQL阈值（毫秒）
         */
        private long slowSqlThreshold = 1000L;
    }

    /**
     * 加密配置类
     */
    @Data
    public static class EncryptConfig {
        /**
         * 加密算法类型
         */
        private String algorithm = "AES";

        /**
         * 加密密钥
         */
        private String secretKey = "";

        /**
         * 自动解密响应数据
         */
        private boolean autoDecryptResponse = true;
    }

    /**
     * 脱敏配置类
     */
    @Data
    public static class DesensitizationConfig {
        /**
         * 是否开启接口响应脱敏
         */
        private boolean responseEnabled = true;

        /**
         * 是否开启日志脱敏
         */
        private boolean logEnabled = true;
    }

    /**
     * 缓存配置类
     */
    @Data
    public static class CacheConfig {
        /**
         * 缓存类型（local/redis）
         */
        private String type = "local";

        /**
         * 默认过期时间（秒）
         */
        private long ttl = 1800;

        /**
         * 是否启用二级缓存
         */
        private boolean level2Enabled = false;

        /**
         * 最大缓存条数（本地缓存）
         */
        private int maxSize = 10000;
    }
}
